package com.jxin.util.serialize.handler;

import com.jxin.util.serialize.err.SerializeExc;
import org.springframework.lang.Nullable;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 序列化执行器接口
 * @author Jxin
 * @version 1.0
 * @since 2020/1/21 11:10
 */
public interface ISerializeHandler {
    /**
     * 获取 序列化执行器实现 的类型
     * @return 序列化执行器实现 的类型
     * @author Jxin
     */
    Integer type();

    /**
     * 序列化的对象
     * 1.入参为null时 返回空 字节数组
     * @param obj 要序列化的对象
     * @param <T> 对象类型
     * @throws SerializeExc 序列化失败时
     * @return 序列化后的字节数组
     * @author Jxin
     */
     <T> byte[] serialize(T obj);

    /**
     * 反序列化对象
     * 1.字节数组为空数组时  解析出来的对象为 null
     * @param objByteArr 对象的字节数组
     * @param clazz      对象的字节码类型
     * @param <T>        对象类型
     * @throws SerializeExc 反序列化失败时
     * @throws IllegalArgumentException 反序列化指定类 为null
     * @return 对象实例
     * @author Jxin
     */
    @Nullable
     <T> T deserialize(byte[] objByteArr, @NotNull Class<T> clazz);

    /**
     * 序列化对象列表
     * 1.入参为空时 返回空 字节数组
     * @param objList 要序列化的对象列表
     * @param <T>     对象类型
     * @throws SerializeExc 序列化失败时
     * @return 序列化后的字节数组
     * @author Jxin
     */
    <T> byte[] serializeList(List<T> objList);

    /**
     * 反序列化对象列表
     * 1.字节数组为空数组时  解析出来的对象为 空列表
     * @param  objByteArr 对象字节数组
     * @param  clazz      字节码类型
     * @param  <T>        对象类型
     * @throws SerializeExc 反序列化失败时
     * @throws IllegalArgumentException 反序列化指定类 为null
     * @return 对象列表
     * @author Jxin
     */
     <T> List<T> deserializeList(@NotEmpty byte[] objByteArr, @NotNull Class<T> clazz);
}
